home *** CD-ROM | disk | FTP | other *** search
/ United Public Domain Gold 2 / United Public Domain Gold 2.iso / utilities / pu248.dms / pu248.adf / Intuition / Menus / Example3.c < prev    next >
C/C++ Source or Header  |  1992-05-01  |  19KB  |  450 lines

  1. /***********************************************************/
  2. /*                                                         */
  3. /* Amiga C Encyclopedia (ACE) V3.0      Amiga C Club (ACC) */
  4. /* -------------------------------      ------------------ */
  5. /*                                                         */
  6. /* Book:    ACM Intuition               Amiga C Club       */
  7. /* Chapter: Menus                       Tulevagen 22       */
  8. /* File:    Example3.c                  181 41  LIDINGO    */
  9. /* Author:  Anders Bjerin               SWEDEN             */
  10. /* Date:    92-05-01                                       */
  11. /* Version: 1.10                                           */
  12. /*                                                         */
  13. /*   Copyright 1992, Anders Bjerin - Amiga C Club (ACC)    */
  14. /*                                                         */
  15. /* Registered members may use this program freely in their */
  16. /*     own commercial/noncommercial programs/articles.     */
  17. /*                                                         */
  18. /***********************************************************/
  19.  
  20. /* This program opens a normal window to which we connect a menu strip. */
  21. /* The menu will look like this:                                        */
  22. /*                                                                      */
  23. /* Edit                                                                 */
  24. /* ----------                                                           */
  25. /* | Style -----------------------                                      */
  26. /* --------| v Plain       [A] P |                                      */
  27. /*         |   Bold        [A] B |                                      */
  28. /*         |   Underlined  [A] U |                                      */
  29. /*         |   Italic      [A] I |                                      */
  30. /*         -----------------------                                      */
  31. /*                                                                      */
  32. /* This example is very similar to Example2, but the user can this time */
  33. /* also access the subitems from the keyboard. For example, to select   */
  34. /* Bold the user only needs to press the right Amiga key [A] together   */
  35. /* with the "B" key. */
  36.  
  37.  
  38.  
  39. #include <intuition/intuition.h>
  40.  
  41.  
  42.  
  43. struct IntuitionBase *IntuitionBase;
  44.  
  45.  
  46.  
  47. /*************************************************************************/
  48. /*                      F O U R T H   S U B I T E M                      */
  49. /*************************************************************************/
  50.  
  51. /* The text for the fourth subitem: */
  52. struct IntuiText my_fourth_text=
  53. {
  54.   2,            /* FrontPen, black. */
  55.   0,            /* BackPen, not used since JAM1. */
  56.   JAM1,         /* DrawMode, do not change the background. */
  57.   CHECKWIDTH,   /* LeftEdge, CHECKWIDTH amount of pixels out. */
  58.                 /* This will leave enough space for the check mark. */
  59.   1,            /* TopEdge, 1 line down. */
  60.   NULL,         /* TextAttr, default font. */
  61.   "Italic",     /* IText, the string. */
  62.   NULL          /* NextItem, no link to other IntuiText structures. */
  63. };
  64.  
  65. /* The MenuItem structure for the fourth subitem: */
  66. struct MenuItem my_fourth_subitem=
  67. {
  68.   NULL,            /* NextItem, this is the last subitem in the list. */
  69.   50,              /* LeftEdge, 50 pixels out. */
  70.   35,              /* TopEdge, 35 lines down. */
  71.   150,             /* Width, 150 pixels wide. */
  72.                    /*        150 pixels is enough in this example (the */
  73.                    /*        Amiga key + character fits perfectly), but */
  74.                    /*        if you are not sure you can always add the */
  75.                    /*        constant COMMWIDTH. Eg, 150 + COMMWIDTH. */
  76.   10,              /* Height, 10 lines high. */
  77.   ITEMTEXT|        /* Flags, render this item with text. */
  78.   ITEMENABLED|     /*        this item will be enabled. */
  79.   CHECKIT|         /*        it is an attribute item. */
  80.   COMMSEQ|         /*        also accessable from the keyboard. */
  81.   HIGHCOMP,        /*        complement the colours when highlihted. */
  82.   0x00000001,      /* MutualExclude, mutualexclude the first subitem. */
  83.   (APTR) &my_fourth_text, /* ItemFill, pointer to the text. */
  84.   NULL,            /* SelectFill, nothing since we complement the col. */
  85.   'I',             /* Command, the user can select this item by      */
  86.                    /*          pressing the right Amiga key together */
  87.                    /*          with the I key. Remember to:          */ 
  88.                    /*          1. Set the flag COMMSEQ.              */
  89.                    /*          2. Make the itembox wide enough.      */
  90.                    /*          (Intuition does not care if you write */
  91.                    /*          a capital letter or not. Pressing the */
  92.                    /*          Amiga key together with an 'I' or an  */
  93.                    /*          'i' makes no difference.)             */
  94.   NULL,            /* SubItem, ignored by Intuition. */
  95.   MENUNULL,        /* NextSelect, no items selected. */
  96. };
  97.  
  98.  
  99.  
  100. /*************************************************************************/
  101. /*                       T H I R D   S U B I T E M                       */
  102. /*************************************************************************/
  103.  
  104. /* The text for the third subitem: */
  105. struct IntuiText my_third_text=
  106. {
  107.   2,            /* FrontPen, black. */
  108.   0,            /* BackPen, not used since JAM1. */
  109.   JAM1,         /* DrawMode, do not change the background. */
  110.   CHECKWIDTH,   /* LeftEdge, CHECKWIDTH amount of pixels out. */
  111.                 /* This will leave enough space for the check mark. */
  112.   1,            /* TopEdge, 1 line down. */
  113.   NULL,         /* TextAttr, default font. */
  114.   "Underlined", /* IText, the string. */
  115.   NULL          /* NextItem, no link to other IntuiText structures. */
  116. };
  117.  
  118. /* The MenuItem structure for the third subitem: */
  119. struct MenuItem my_third_subitem=
  120. {
  121.   &my_fourth_subitem, /* NextItem, linked to the fourth subitem. */
  122.   50,              /* LeftEdge, 50 pixels out. */
  123.   25,              /* TopEdge, 25 lines down. */
  124.   150,             /* Width, 150 pixels wide. */
  125.   10,              /* Height, 10 lines high. */
  126.   ITEMTEXT|        /* Flags, render this item with text. */
  127.   ITEMENABLED|     /*        this item will be enabled. */
  128.   CHECKIT|         /*        it is an attribute item. */
  129.   COMMSEQ|         /*        also accessable from the keyboard. */
  130.   HIGHCOMP,        /*        complement the colours when highlihted. */
  131.   0x00000001,      /* MutualExclude, mutualexclude the first subitem. */
  132.   (APTR) &my_third_text, /* ItemFill, pointer to the text. */
  133.   NULL,            /* SelectFill, nothing since we complement the col. */
  134.   'U',             /* Command, the user can select this item by      */
  135.                    /*          pressing the right Amiga key together */
  136.                    /*          with the U key. */ 
  137.   NULL,            /* SubItem, ignored by Intuition. */
  138.   MENUNULL,        /* NextSelect, no items selected. */
  139. };
  140.  
  141.  
  142.  
  143. /*************************************************************************/
  144. /*                      S E C O N D   S U B I T E M                      */
  145. /*************************************************************************/
  146.  
  147. /* The text for the second subitem: */
  148. struct IntuiText my_second_text=
  149. {
  150.   2,          /* FrontPen, black. */
  151.   0,          /* BackPen, not used since JAM1. */
  152.   JAM1,       /* DrawMode, do not change the background. */
  153.   CHECKWIDTH, /* LeftEdge, CHECKWIDTH amount of pixels out. */
  154.               /* This will leave enough space for the check mark. */
  155.   1,          /* TopEdge, 1 line down. */
  156.   NULL,       /* TextAttr, default font. */
  157.   "Bold",     /* IText, the string. */
  158.   NULL        /* NextItem, no link to other IntuiText structures. */
  159. };
  160.  
  161. /* The MenuItem structure for the second subitem: */
  162. struct MenuItem my_second_subitem=
  163. {
  164.   &my_third_subitem, /* NextItem, linked to the third subitem. */
  165.   50,              /* LeftEdge, 50 pixels out. */
  166.   15,              /* TopEdge, 15 lines down. */
  167.   150,             /* Width, 150 pixels wide. */
  168.   10,              /* Height, 10 lines high. */
  169.   ITEMTEXT|        /* Flags, render this item with text. */
  170.   ITEMENABLED|     /*        this item will be enabled. */
  171.   CHECKIT|         /*        it is an attribute item. */
  172.   COMMSEQ|         /*        also accessable from the keyboard. */
  173.   HIGHCOMP,        /*        complement the colours when highlihted. */
  174.   0x00000001,      /* MutualExclude, mutualexclude the first subitem. */
  175.   (APTR) &my_second_text, /* ItemFill, pointer to the text. */
  176.   NULL,            /* SelectFill, nothing since we complement the col. */
  177.   'B',             /* Command, the user can select this item by      */
  178.                    /*          pressing the right Amiga key together */
  179.                    /*          with the B key. */ 
  180.   NULL,            /* SubItem, ignored by Intuition. */
  181.   MENUNULL,        /* NextSelect, no items selected. */
  182. };
  183.  
  184.  
  185.  
  186. /*************************************************************************/
  187. /*                       F I R S T   S U B I T E M                       */
  188. /*************************************************************************/
  189.  
  190. /* The text for the first subitem: */
  191. struct IntuiText my_first_text=
  192. {
  193.   2,          /* FrontPen, black. */
  194.   0,          /* BackPen, not used since JAM1. */
  195.   JAM1,       /* DrawMode, do not change the background. */
  196.   CHECKWIDTH, /* LeftEdge, CHECKWIDTH amount of pixels out. */
  197.               /* This will leave enough space for the check mark. */
  198.   1,          /* TopEdge, 1 line down. */
  199.   NULL,       /* TextAttr, default font. */
  200.   "Plain",    /* IText, the string. */
  201.   NULL        /* NextItem, no link to other IntuiText structures. */
  202. };
  203.  
  204. /* The MenuItem structure for the first subitem: */
  205. struct MenuItem my_first_subitem=
  206. {
  207.   &my_second_subitem, /* NextItem, linked to the second subitem. */
  208.   50,              /* LeftEdge, 50 pixels out. */
  209.   5,               /* TopEdge, 5 lines down. */
  210.   150,             /* Width, 150 pixels wide. */
  211.   10,              /* Height, 10 lines high. */
  212.   ITEMTEXT|        /* Flags, render this item with text. */
  213.   ITEMENABLED|     /*        this item will be enabled. */
  214.   CHECKIT|         /*        it is an attribute item. */
  215.   CHECKED|         /*        this item is initially selected. */
  216.   COMMSEQ|         /*        also accessable from the keyboard. */
  217.   HIGHCOMP,        /*        complement the colours when highlihted. */
  218.   0xFFFFFFFE,      /* MutualExclude, mutualexclude all items except the */
  219.                    /*                first one. */
  220.   (APTR) &my_first_text, /* ItemFill, pointer to the text. */
  221.   NULL,            /* SelectFill, nothing since we complement the col. */
  222.   'P',             /* Command, the user can select this item by      */
  223.                    /*          pressing the right Amiga key together */
  224.                    /*          with the P key. */ 
  225.   NULL,            /* SubItem, ignored by Intuition. */
  226.   MENUNULL,        /* NextSelect, no items selected. */
  227. };
  228.  
  229.  
  230.  
  231. /*************************************************************************/
  232. /*                       T H E   O N L Y   I T E M                       */
  233. /*************************************************************************/
  234.  
  235. /* The text for the item: */
  236. struct IntuiText my_text=
  237. {
  238.   2,          /* FrontPen, black. */
  239.   0,          /* BackPen, not used since JAM1. */
  240.   JAM1,       /* DrawMode, do not change the background. */
  241.   0,          /* LeftEdge, 0 pixels out. */
  242.               /* No space is needed for a check mark. */
  243.   1,          /* TopEdge, 1 line down. */
  244.   NULL,       /* TextAttr, default font. */
  245.   "Style",    /* IText, the string. */
  246.   NULL        /* NextItem, no link to other IntuiText structures. */
  247. };
  248.  
  249. /* The MenuItem structure for the item: */
  250. struct MenuItem my_item=
  251. {
  252.   NULL,              /* NextItem, no more items after this one. */
  253.   0,                 /* LeftEdge, 0 pixels out. */
  254.   0,                 /* TopEdge, 0 lines down. */
  255.   100,               /* Width, 100 pixels wide. */
  256.   10,                /* Height, 10 lines high. */
  257.   ITEMTEXT|          /* Flags, render this item with text. */
  258.   ITEMENABLED|       /*        this item will be enabled. */
  259.                      /*        it is an action item. (CHECKIT is not set) */
  260.   HIGHCOMP,          /*        complement the colours when highlihted. */
  261.   0,                 /* MutualExclude, no mutualexclude. */
  262.   (APTR) &my_text,   /* ItemFill, pointer to the text. */
  263.   NULL,              /* SelectFill, nothing since we complement the col. */
  264.   0,                 /* Command, no command-key sequence. */
  265.   &my_first_subitem, /* SubItem, pointer to the first subitem. */
  266.   MENUNULL,          /* NextSelect, no items selected. */
  267. };
  268.  
  269.  
  270.  
  271. /*************************************************************************/
  272. /*                              M E N U                                  */
  273. /*************************************************************************/
  274.  
  275. /* The Menu structure for the first (and only) menu: */
  276. struct Menu my_menu=
  277. {
  278.   NULL,        /* NextMenu, no more menu structures. */
  279.   0,           /* LeftEdge, left corner. */
  280.   0,           /* TopEdge, for the moment ignored by Intuition. */
  281.   50,          /* Width, 50 pixels wide. */
  282.   0,           /* Height, for the moment ignored by Intuition. */
  283.   MENUENABLED, /* Flags, this menu will be enabled. */
  284.   "Edit",      /* MenuName, the string. */
  285.   &my_item     /* FirstItem, pointer to the first (and only) item in */
  286.                /* the list. */
  287. };
  288.  
  289.  
  290.  
  291. /* Declare a pointer to a Window structure: */ 
  292. struct Window *my_window;
  293.  
  294. /* Declare and initialize your NewWindow structure: */
  295. struct NewWindow my_new_window=
  296. {
  297.   50,            /* LeftEdge    x position of the window. */
  298.   25,            /* TopEdge     y positio of the window. */
  299.   200,           /* Width       200 pixels wide. */
  300.   100,           /* Height      100 lines high. */
  301.   0,             /* DetailPen   Text should be drawn with colour reg. 0 */
  302.   1,             /* BlockPen    Blocks should be drawn with colour reg. 1 */
  303.   CLOSEWINDOW|   /* IDCMPFlags  The window will give us a message if the */
  304.                  /*             user has selected the Close window gad. */
  305.   MENUPICK,
  306.   SMART_REFRESH| /* Flags       Intuition should refresh the window. */
  307.   WINDOWCLOSE|   /*             Close Gadget. */
  308.   WINDOWDRAG|    /*             Drag gadget. */
  309.   WINDOWDEPTH|   /*             Depth arrange Gadgets. */
  310.   WINDOWSIZING|  /*             Sizing Gadget. */
  311.   ACTIVATE,      /*             The window should be Active when opened. */
  312.   NULL,          /* FirstGadget No Custom gadgets. */
  313.   NULL,          /* CheckMark   Use Intuition's default CheckMark. */
  314.   "Style Editor",/* Title       Title of the window. */
  315.   NULL,          /* Screen      Connected to the Workbench Screen. */
  316.   NULL,          /* BitMap      No Custom BitMap. */
  317.   80,            /* MinWidth    We will not allow the window to become */
  318.   30,            /* MinHeight   smaller than 80 x 30, and not bigger */
  319.   300,           /* MaxWidth    than 300 x 200. */
  320.   200,           /* MaxHeight */
  321.   WBENCHSCREEN   /* Type        Connected to the Workbench Screen. */
  322. };
  323.  
  324.  
  325.  
  326. main()
  327. {
  328.   /* Boolean variable used for the while loop: */
  329.   BOOL close_me;
  330.  
  331.   /* Declare a variable in which we will store the IDCMP flag: */
  332.   ULONG class;
  333.   
  334.   /* If we recieve a MENUPICK event, the Code field of the message */
  335.   /* structure will contain the menu number of the first selected item. */
  336.   /* Declare a variable to store the Code value in, and an extra menu */
  337.   /* number variable: */
  338.   USHORT code, menu_number;
  339.   
  340.   /* Declare a MenuItem pointer: */
  341.   struct MenuItem *item;
  342.   
  343.   /* Declare a pointer to an IntuiMessage structure: */
  344.   struct IntuiMessage *my_message;
  345.  
  346.  
  347.  
  348.   /* Before we can use Intuition we need to open the Intuition Library: */
  349.   IntuitionBase = (struct IntuitionBase *)
  350.     OpenLibrary( "intuition.library", 0 );
  351.   
  352.   if( IntuitionBase == NULL )
  353.     exit(); /* Could NOT open the Intuition Library! */
  354.  
  355.  
  356.  
  357.   /* We will now try to open the window: */
  358.   my_window = (struct Window *) OpenWindow( &my_new_window );
  359.   
  360.   /* Have we opened the window succesfully? */
  361.   if(my_window == NULL)
  362.   {
  363.     /* Could NOT open the Window! */
  364.     
  365.     /* Close the Intuition Library since we have opened it: */
  366.     CloseLibrary( IntuitionBase );
  367.  
  368.     exit();  
  369.   }
  370.  
  371.  
  372.  
  373.   /* We have opened the window, and everything seems to be OK. */
  374.  
  375.  
  376.  
  377.   SetMenuStrip( my_window, &my_menu );
  378.   printf("Menustrip connected to window!\n");
  379.  
  380.  
  381.   close_me = FALSE;
  382.  
  383.   /* Stay in the while loop until the user has selected the Close window */
  384.   /* gadget: */
  385.   while( close_me == FALSE )
  386.   {
  387.     /* Wait until we have recieved a message: */
  388.     Wait( 1 << my_window->UserPort->mp_SigBit );
  389.  
  390.     /* As long as we collect messages sucessfully we stay in the loop: */
  391.     while(my_message=(struct IntuiMessage *) GetMsg( my_window->UserPort ))
  392.     {
  393.       /* After we have collected the message we can read it, and save any */
  394.       /* important values which we maybe want to check later: */
  395.       class = my_message->Class;
  396.       code = my_message->Code;
  397.  
  398.  
  399.       /* After we have read it we reply as fast as possible: */
  400.       /* REMEMBER! Do never try to read a message after you have replied! */
  401.       /* Some other process has maybe changed it. */
  402.       ReplyMsg( my_message );
  403.  
  404.       /* Check which IDCMP flag was sent: */
  405.       if( class == CLOSEWINDOW )
  406.         close_me=TRUE; /* The user selected the Close window gadget! */  
  407.  
  408.       if(class == MENUPICK)
  409.       {
  410.         printf("\nMenu pick!\n");
  411.         menu_number = code;
  412.         
  413.         while( menu_number != MENUNULL )
  414.         {
  415.           /* Get the address of the item: */
  416.           item = (struct MenuItem *) ItemAddress( &my_menu, menu_number );
  417.  
  418.  
  419.           /* Print out the menu number plus etc: */
  420.           printf("menu_number= %d\n", menu_number );
  421.           printf("MENUNUM = %d\n", MENUNUM(menu_number) );
  422.           printf("ITEMNUM = %d\n", ITEMNUM(menu_number) );
  423.           printf("SUBNUM  = %d\n", SUBNUM(menu_number) );
  424.  
  425.  
  426.           /* Get the following item's menu number: */
  427.           menu_number = item->NextSelect;
  428.         }
  429.       }
  430.     }
  431.   }
  432.  
  433.  
  434.  
  435.   printf("Menustrip removed from window!\n");
  436.   ClearMenuStrip( my_window );
  437.  
  438.  
  439.  
  440.   /* Close the window: */
  441.   CloseWindow( my_window );
  442.  
  443.  
  444.  
  445.   /* Close the Intuition Library since we have opened it: */
  446.   CloseLibrary( IntuitionBase );
  447.   
  448.   /* THE END */
  449. }
  450.